/**
 * Copyright (c) 2002-2017 "Neo Technology,"
 * Network Engine for Objects in Lund AB [http://neotechnology.com]
 *
 * This file is part of Neo4j.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.neo4j.driver.internal.util;

import java.io.ByteArrayOutputStream;
import java.io.PrintStream;
import java.io.UnsupportedEncodingException;
import java.util.List;

import static java.util.Arrays.asList;

public class CaptureStdOut
{
    private ByteArrayOutputStream capturedOut = new ByteArrayOutputStream();
    private ByteArrayOutputStream capturedErr = new ByteArrayOutputStream();

    public AutoCloseable capture()
    {
        final PrintStream stdOut = System.out;
        final PrintStream stdErr = System.err;
        System.setOut( new PrintStream( capturedOut ) );
        System.setErr( new PrintStream( capturedErr ) );
        return new AutoCloseable()
        {
            @Override
            public void close() throws Exception
            {
                System.setOut( stdOut );
                System.setErr( stdErr );
            }
        };
    }

    public List<String> out()
    {
        return lines( capturedOut );
    }

    public List<String> err()
    {
        return lines( capturedErr );
    }

    private List<String> lines( ByteArrayOutputStream buff )
    {
        try
        {
            return asList( buff.toString( "utf-8" ).split( System.getProperty("line.separator") ));
        }
        catch ( UnsupportedEncodingException e )
        {
            throw new AssertionError( e );
        }
    }
}
